package cn.dapeng.spring.core;

import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.List;

public interface BeanDefinition {

    String SCOPE_SINGLETON = "singleton";

    String SCOPE_PROTOTYPE = "prototype";

    Class<?> getBeanClass();

    String getScope();

    boolean isSingleton();

    boolean isPrototype();

    String getFactoryBeanName();

    String getFactoryMethodName();

    String getInitMethodName();

    String getDestroyMethodName();

    boolean isPrimary();

    default boolean validate() {
        if (this.getBeanClass() == null) {
            if (StringUtils.isBlank(getFactoryBeanName()) || StringUtils.isBlank(getFactoryMethodName())) {
                return false;
            }
        }

        return this.getBeanClass() != null && StringUtils.isNotBlank(getFactoryBeanName());
    }

    /**
     * 获得构造参数定义 <br>
     * add in V2
     */
    List<?> getConstructorArgumentValues();

    /**
     * 属性依赖注入
     */
    List<PropertyValue> getPropertyValues();

    /**
     * 构造函数注入
     *
     * @return
     */
    public Constructor<?> getConstructor();

    public void setConstructor(Constructor<?> constructor);

    public Method getFactoryMethod();

    public void setFactoryMethod(Method factoryMethod);

    public Object[] getConstructorArgumentRealValues();

    public void setConstructorArgumentRealValues(Object[] values);

}
